import Vue from "vue";
import VXETablePluginElement from "vxe-table-plugin-element";
// import "../theme/index.scss";
import "vxe-table-plugin-element/dist/style.css";
import tableDefConfig from "./tableOptDef.js";
// import { createTableButtonComp } from "@/common/components/globalComp/index";
import { cellRender } from "../expands/index.js";

import {
  VXETable,
  Table,
  Column,
  Header,
  Footer,
  Icon,
  Filter,
  Edit,
  Validator,
  Tooltip,
  Pager,
  Checkbox,
  Radio,
  Input,
  Select,
  Button,
  Toolbar,
  Form,
  Export,
  Pulldown,

} from "vxe-table";

/**
 * @name: TableConfig
 * @description: 初始化表格模块安装及一些拓展方法
 * @type: class
 * @param {Array} modules? 非必填，表格模块集合
 * @return {object} this
 */
export class TableConfig {
  constructor(modules) {
    // 安装依赖模块
    Vue.use(Column);
    Vue.use(Header);
    Vue.use(Footer);
    Vue.use(Icon);
    Vue.use(Filter);
    Vue.use(Edit);
    Vue.use(Validator);
    Vue.use(Tooltip);
    Vue.use(Pager);
    Vue.use(Checkbox);
    Vue.use(Radio);
    Vue.use(Input);
    Vue.use(Select);
    Vue.use(Button);
    Vue.use(Toolbar);
    Vue.use(Form);
    Vue.use(Export); 
    Vue.use(Pulldown);
    
    if (modules && Array.isArray(modules)) {
      modules.forEach(module => {
        Vue.use(module);
      });
    }
    // 在安装核心库
    Vue.use(Table);

    this.usePlugin(VXETablePluginElement); // 默认使用Element插件
  }

  // 安装插件
  usePlugin(plugin) {
    VXETable.use(plugin);
    return this;
  }

  // 设置配置项
  setupOpintion(option) {
    VXETable.setup(option);
    return this;
  }

  // 初始化全局默认配置
  initDefaultOptions(options = {}) {
    const resDefConfig = this._recursive(tableDefConfig, options);
    let gwBtnOpt = Object.assign({}, resDefConfig.gwButton);
    delete resDefConfig.gwButton;
    VXETable.setup(resDefConfig); // 全局默认配置
    // createTableButtonComp(Vue, gwBtnOpt); // 创建表格按钮组件
    return this;
  }

  // 初始化默认自定义渲染器
  initExtendsRender() {
    cellRender(VXETable); // 初始化表格渲染拓展
    return this;
  }

  // 添加格外自定义渲染器
  addExtendsRender(renderOpt) {
    if (this._isObj(renderOpt)) {
      const { name, option } = renderOpt;
      VXETable.renderer.add(name, option);
    } else if (this._isArr(renderOpt)) {
      renderOpt.forEach(item => {
        const { name, option } = item;
        VXETable.renderer.add(name, option);
      });
    }
    return this;
  }

  // 递归参数
  _recursive(wholeOpt, opts) {
    for (const key in opts) {
      if (wholeOpt.hasOwnProperty(key)) {
        if (!this._isObj(opts[key])) {
          wholeOpt[key] = opts[key];
        } else {
          this._recursive(wholeOpt[key], opts[key]);
        }
      } else {
        wholeOpt[key] = opts[key];
      }
    }
    return wholeOpt;
  }

  // 私有方法，是否为对象
  _isObj(obj) {
    if (Object.prototype.toString.call(obj) === "[object Object]") {
      return true;
    } else {
      return false;
    }
  }
  // 私有方法，是否为数组
  _isArr(obj) {
    if (Object.prototype.toString.call(obj) === "[object Array]") {
      return true;
    } else {
      return false;
    }
  }
}
